package main

import (
	"encoding/json"
	"fmt"
	"log"
	"net/http"
	"time"
)

var FreeChan = make(chan ResponseWithDeltaStruct, 100)

func SetUpSSE() {
	// 创建一个 HTTP 服务器
	http.HandleFunc("/sse", SSEHandler)

	// 启动 HTTP 服务
	log.Println("Starting SSE server on :8080")
	err := http.ListenAndServe(":8080", nil)
	if err != nil {
		log.Fatal("ListenAndServe: ", err)
	}
}

// SSEHandler 处理 SSE 连接
func SSEHandler(w http.ResponseWriter, r *http.Request) {
	// 设置响应头，表明这是一个 SSE 流
	w.Header().Set("Content-Type", "text/event-stream")
	w.Header().Set("Cache-Control", "no-cache")
	w.Header().Set("Connection", "keep-alive")
	w.Header().Set("Access-Control-Allow-Origin", "*") // 允许跨域

	// 监听客户端是否断开连接
	notify := r.Context().Done() // 使用 Context 的 Done 通道监听连接状态

	// 从 FreeChan 中读取数据并发送给客户端
	for {
		select {
		case chunk := <-FreeChan:
			// 将 chunk 转换为 JSON
			jsonData, err := json.Marshal(chunk)
			if err != nil {
				log.Printf("JSON 编码失败: %v\n", err)
				continue
			}

			// 发送数据给客户端
			fmt.Fprintf(w, "data: %s\n\n", jsonData)
			w.(http.Flusher).Flush() // 刷新响应流

		case <-notify:
			// 客户端断开连接
			log.Println("Client disconnected")
			return

		case <-time.After(30 * time.Second):
			// 发送心跳包，防止连接超时
			fmt.Fprintf(w, ": heartbeat\n\n")
			w.(http.Flusher).Flush()
		}
	}
}
